<template>
<basic-dialog
  title="高级关联"
  width="40%"
  :visible="dialogVisible"
  :show-close="false"
>

  <slot name="conditionSlot"/>

  <el-table
    border
    ref="elTable"
    :data="tableData"
    :height="tableHeight"
  >
    <el-table-column
      v-for="item in columns"
      :key="item.prop"
      :prop="item.prop"
      :label="item.label"
      :width="item.width"
      :align="item.align || 'center'"
    >
      <template v-slot="scope">
        <el-input
          type="textarea"
          resize="none"
          :autosize="{ minRows: textareaRows, maxRows: textareaRows }"
          :placeholder="`请输入${item.label}`"
          v-model="scope.row[scope.column.property]"
        ></el-input>
      </template>
    </el-table-column>
  </el-table>
  <el-row type="flex" slot="ft" justify="end">
    <el-button @click="handleCancel">取消</el-button>
    <el-button v-if="showClearBtn" @click="handleClearAll">一键清空</el-button>
    <el-button type="primary" @click="handleSeniorSearch">{{ okText }}</el-button>
  </el-row>
</basic-dialog>
</template>
<script>
import BasicDialog from '@/components/BasicDialog';
export default {
  props: {
    /* 关联弹框显隐开关 */
    visible: {
      type: Boolean,
      default: false
    },
    /* 表格列 */
    columns: {
      type: Array,
      default () {
        return []
      }
    },
    /* 表格高度 */
    tableHeight: {
      type: Number,
      default: 480,
    },
    /* 最大提交量，默认1000 */
    submitLimitLength: {
      type: Number,
      default: 1000
    },
    /* 默认表格数据 */
    dataSource: {
      type: Array,
      default () {
        return []
      }
    },
    okText: {
      type: String,
      default: '高级查询'
    },
    showClearBtn: { // 是否展示一键清空按钮
      type: Boolean,
      default: false
    }
  },
  components: {
    BasicDialog
  },
  data () {
    return {
      dialogVisible: false,
      tableData: this.dataSource
    }
  },
  watch: {
    visible (val) {
      this.dialogVisible = val;
    }
  },
  computed: {
    /* textarea高度 */
    textareaRows () {
      return Math.floor(this.tableHeight / 24);
    },
  },
  methods: {
    // 输入为空
    isEmptyByInputText (textList) {
      // 有任何一个文本框内容为空（包括只有空串和空行），就等价于有空集
      return Object.values(textList).some(item => item.length === 0);
    },
    // 只有一个检索条件（即只有一个textarea）
    isSingleSearchCondition (list) {
      return list.length === 1;
    },
    // 多个检索条件文本行数不一致
    isInconsistentByTextLines (inputTextValues) {
      const uniqTextareaNum = _.uniq(inputTextValues.map(item => item.length)).length; // 去重后的文本框个数
      if (uniqTextareaNum !== 1) { // 去重后如果不为1，即有检索条件行数不一致
        return true;
      }
      return false;
    },
    // 获取所有文本框split为集合后的对象
    getObjectBySplitAllTextarea (dataSource) {
      const result = {};
      for (let key in dataSource) {
        // 去除空格字符，根据回车换行符切割，过滤空行
        result[key] = dataSource[key].replace(/[ ]/g, '').split(/\n/).filter(item => item);
      }
      return result;
    },
    // 获取重组后的结果集合
    getArraysByTextListRestruct (textList) {
      const inputTextKeys = Object.keys(textList); // 所有文本框的key集合
      const inputTextValues = Object.values(textList); // 所有文本框的values集合
      const uniqTextLines = _.uniq(inputTextValues.map(item => item.length))[0]; // 去重后的文本行数
      const textareaNum = inputTextKeys.length; // 检索条件的textarea个数
      const resultList = [];
      for (let i = 0; i < uniqTextLines; i++) {
        let object = {};
        for (let j = 0; j < textareaNum; j++) {
          object[inputTextKeys[j]] = inputTextValues[j][i];
        }
        /* 集合去空操作 */
        const isEmptyList = Object.values(object).filter(item => !item);
        if (isEmptyList.length === 0) {
          resultList.push(object);
        }
      }
      return resultList;
    },
    // 获取各种任务执行完毕所得到的结果
    getResultByRunTasks (source) {
      const textList = this.getObjectBySplitAllTextarea(source); // 获取分隔去空后的文本集合
      const valuesOfTextList = Object.values(textList); // 分割后对象的values集合
      if (this.isEmptyByInputText(textList)) {
        this.$message.warning('检索条件必须精确，不能为空');
        return false;
      }
      if (this.isSingleSearchCondition(valuesOfTextList)) { // 如果只有一个检索条件，无需组装键值对集合，直接返回去空的list
        return valuesOfTextList[0].filter(item => item);
      }
      if (this.isInconsistentByTextLines(valuesOfTextList)) { // 如果有多个检索条件，需要判断长度是否一致，并且组装成键值对集合
        this.$message.warning('请确保输入条件一一对应，数量一致');
        return false;
      }
      return this.getArraysByTextListRestruct(textList);
    },
    // 高级查询事件
    handleSeniorSearch () {
      const result = this.getResultByRunTasks(this.tableData[0]);
      if (result.length > this.submitLimitLength) {
        return this.$message.warning(`当前提交的行数不能超过${this.submitLimitLength}`);
      }
      if (result) {
        this.$emit('seniorSearchResult', result);
        this.$emit('update:visible', false);
      }
    },
    // 取消事件
    handleCancel () {
      this.$emit('update:visible', false);
    },
    // 一键清空事件
    handleClearAll () {
      this.tableData = this.columns.map(item => ({ [item.prop]: '' }))
      this.$emit('clear', [])
      this.$emit('update:visible', false);
    }
  }
}
</script>
